/**
 * @description: 带过期时间的存储封装
 */
class Storage {
    /**
     * 设置缓存（带过期时间）
     * @param {string} key 键名
     * @param {any} value 值
     * @param {number} expire 过期时间（毫秒）
     */
    static set(key, value, expire = 0) {
        try {
            const data = {
                value,
                expire: expire > 0 ? Date.now() + expire : 0,
                timestamp: Date.now()
            }
            wx.setStorageSync(key, data)
            return true
        } catch (error) {
            console.error('存储失败:', error)
            return false
        }
    }

    /**
     * 获取缓存（自动处理过期）
     * @param {string} key 键名
     * @param {any} defaultValue 默认值
     * @returns {any} 存储的值或默认值
     */
    static get(key, defaultValue = null) {
        try {
            const data = wx.getStorageSync(key)
            
            // 如果数据不存在
            if (!data) {
                return defaultValue
            }
            
            // 检查是否过期
            if (data.expire > 0 && Date.now() > data.expire) {
                // 数据已过期，自动删除
                this.remove(key)
                return defaultValue
            }
            
            return data.value
        } catch (error) {
            console.error('获取存储失败:', error)
            return defaultValue
        }
    }

    /**
     * 删除缓存
     * @param {string} key 键名
     */
    static remove(key) {
        try {
            wx.removeStorageSync(key)
            return true
        } catch (error) {
            console.error('删除存储失败:', error)
            return false
        }
    }

    /**
     * 清空所有缓存
     */
    static clear() {
        try {
            wx.clearStorageSync()
            return true
        } catch (error) {
            console.error('清空存储失败:', error)
            return false
        }
    }

    /**
     * 检查缓存是否存在且未过期
     * @param {string} key 键名
     * @returns {boolean} 是否存在且有效
     */
    static has(key) {
        try {
            const data = wx.getStorageSync(key)
            if (!data) return false
            
            // 检查是否过期
            if (data.expire > 0 && Date.now() > data.expire) {
                this.remove(key)
                return false
            }
            
            return true
        } catch (error) {
            return false
        }
    }

    /**
     * 获取缓存信息（包含过期时间）
     * @param {string} key 键名
     * @returns {object|null} 缓存信息
     */
    static getInfo(key) {
        try {
            const data = wx.getStorageSync(key)
            if (!data) return null
            
            // 检查是否过期
            if (data.expire > 0 && Date.now() > data.expire) {
                this.remove(key)
                return null
            }
            
            return {
                value: data.value,
                expire: data.expire,
                timestamp: data.timestamp,
                remaining: data.expire > 0 ? data.expire - Date.now() : Infinity
            }
        } catch (error) {
            return null
        }
    }

    /**
     * 清理所有过期的缓存
     */
    static clearExpired() {
        try {
            const { keys } = wx.getStorageInfoSync()
            keys.forEach(key => {
                this.get(key) // 获取时会自动清理过期数据
            })
            return true
        } catch (error) {
            console.error('清理过期缓存失败:', error)
            return false
        }
    }
}

// 时间常量（方便使用）
Storage.EXPIRE = {
    SECOND: 1000,
    MINUTE: 60 * 1000,
    HOUR: 60 * 60 * 1000,
    DAY: 24 * 60 * 60 * 1000,
    WEEK: 7 * 24 * 60 * 60 * 1000,
    MONTH: 30 * 24 * 60 * 60 * 1000
}

export default Storage